package com.anc.redis.redis;

import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @author Anc
 * @date 2022/7/01
 */
public interface RedisClient {

    /**
     * 执行脚本
     */
    Object eval(String script, List<String> keys, List<String> args);

    /**
     * get
     */
    Object get(String key);

    /**
     * set
     */
    void set(String key, Object value);

    /**
     * set
     */
    void set(String key, Object value, long expireTime, TimeUnit timeUnit);

    /**
     * setNX
     */
    Boolean setNX(String key, Object value);

    /**
     * 设置过期时间
     */
    Boolean expire(String key, long time, TimeUnit type);

    /**
     * 移除过期时间
     */
    Boolean persist(String key);

    /**
     * 增加
     */
    Long increment(String key, long number);

    /**
     * 增加
     */
    Double increment(String key, double number);

    /**
     * 删除
     */
    Boolean delete(String key);

    /**
     * 批量模糊删除 匹配规则 keys *
     *
     * @param keys
     * @return
     */
    Long batchDeleteByLikeKey(String keys);

    // ==========================hash========================

    void hset(String key, String hashKey, Object value);

    void hsetAll(String key, Map<String, Object> map);

    Boolean hsetNX(String key, String hashKey, Object value);

    Object hget(String key, String hashKey);

    Map hgetAll(String key);

    /**
     * 单参数格式化
     *
     * @param key redis 中 key 使用
     * @return 已格式化的字符串
     */
    String format(final String key);

    /**
     * 双参数初始化
     *
     * @param key1 维度一
     * @param key2 维度二
     * @return 已格式化的key
     */
    String format(final String key1, final String key2);

    /**
     * 双参数初始化
     *
     * @param key1 维度一
     * @param key2 维度二
     * @return 已格式化的key
     */
    String format(final String key1, final String key2, final String key3);

    /**
     * 默认格式化key
     */
    String defaultFormatKey(final String... keys);

    /**
     * 添加数据
     *
     * @param key
     * @param v
     */
    void setAdd(String key, String v);

    /**
     * 随机取出一个数据
     *
     * @param key
     * @return
     */
    String setPop(String key);

    /**
     * 查询集合长度
     *
     * @param key
     * @return
     */
    Long setSize(String key);
}
